package ar.com.tallerdos.smartdinner.model;

import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ar.com.tallerdos.smartdinner.util.StringUtils;

import com.google.gson.annotations.Expose;

@SuppressWarnings("serial")
public class Pedido implements Serializable, Identity {
    
    public enum PedidoEstado {
	
	Nuevo, Pendiente, Comenzado, Terminado, Entregado, Cancelado
    }

    @Expose
    private Integer id;

    @Expose
    private Producto producto;

    @Expose
    private Integer cantidad;

    @Expose
    private Date fechaAlta;

    @Expose
    private PedidoEstado estado;
    
    @Expose
    private Comida comida;
    
    @Expose
    private List<Agregado> agregados;

   // @Expose
    private String comentario;
    
    private Integer codigo;
    
    private Date fechaMod;
    
    private int notificacion;
    
    public Pedido() {
	this.estado = PedidoEstado.Nuevo;
	this.fechaAlta = new Date();
	this.cantidad = 1;
	this.agregados = new ArrayList<Agregado>();
    }

    public Integer getId() {
	return id;
    }

    public void setId(Integer id) {
	this.id = id;
    }

    public Date getFechaAlta() {
	return fechaAlta;
    }

    public void setFechaAlta(Date fechaAlta) {
	this.fechaAlta = fechaAlta;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public PedidoEstado getEstado() {
        return estado;
    }

    public void setEstado(PedidoEstado estado) {
        this.estado = estado;
    }

    public Comida getComida() {
        return comida;
    }

    public void setComida(Comida comida) {
        this.comida = comida;
    }
    
    public Producto getProducto() {
        return producto;
    }

    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }
    
    public void setAgregados(List<Agregado> agregado) {
    	this.agregados = agregado;
    }
    
    public List<Agregado> getAgregados() {
	if (this.agregados == null) {
	    this.agregados = new ArrayList<Agregado>();
	}
    	return this.agregados;
    }

    @Override
    public String toString() {
	if (producto != null && cantidad != null && producto.getPrecio() != null) {
	    String precioFinal = null;
	    if (PedidoEstado.Cancelado.equals(this.estado)) {
		precioFinal = "0.00";
	    } else {
		NumberFormat formatter = new DecimalFormat("#0.00");
		precioFinal = formatter.format(producto.getPrecio() * cantidad);

	    }
	    return this.cantidad + " - " + producto.toString() + ": $"
		    + precioFinal;
	}
	return "";
    }

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((id == null) ? 0 : id.hashCode());
	return result;
    }

    @Override
    public boolean equals(Object obj) {
	if (this == obj)
	    return true;
	if (obj == null)
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	Pedido other = (Pedido) obj;
	if (id == null) {
	    if (other.id != null)
		return false;
	} else if (!id.equals(other.id))
	    return false;
	return true;
    }

    public Date getFechaMod() {
        return fechaMod;
    }

    public void setFechaMod(Date fechaMod) {
        this.fechaMod = fechaMod;
    }
    
    public void setEstado(String estado) {
	for (PedidoEstado pEstado : PedidoEstado.values()) {
	    if (pEstado.name().equalsIgnoreCase(estado)) {
		this.estado = pEstado;
		return;
	    }
	}
    }
    
    public int getNotificacion(){
    	return this.notificacion;
    }
    
    public void setNotificacion(int notif){
    	this.notificacion = notif;
    	this.comida.setNotificacion(notif);
    }
    
    public void setNotificacionPedido(int notif){
    	this.notificacion = notif;
    }
    
    public String getAgregadoDescripcion() {
	return StringUtils.generarDescripcion(this.agregados, 
		    "", "", "", "Selecionar", null);
    }
    
    public String getComentario(){
    	return this.comentario;
    }
    
    public void setComentario(String comentario){
    	this.comentario = comentario;
    }
    
    
}
